package modele;

import java.io.Serializable;
import java.util.ArrayList;

import modele.Batiment.Batiment;
import modele.Batiment.TourArcher;
import modele.Unite.UniteAttaquante;

public class Partie implements Serializable{
	private static final long serialVersionUID = 7418092556224722917L;
	Joueur joueur;
	Joueur adversaire;
	ArrayList<Quete> quetes;
	
	int numeroQueteActuelle = 0;
	boolean finie = false;
	int etatPartie = 0;//0 pour le développement et 1 pour l'attaque
	
	public ArrayList<UniteAttaquante> unitesAttaquantes;
	private ArrayList<Batiment> listeBatimentAdversaire;
	
	public int getEtatPartie() {
		return etatPartie;
	}


	public Partie()
	{
		joueur = new Joueur(this);
		adversaire = new Joueur(this);
		listeBatimentAdversaire = new ArrayList<Batiment>();
		Batiment def = new TourArcher(new Position(3,3));
		def.setJoueur(joueur);
		listeBatimentAdversaire.add(def);
		adversaire.setNbrBatimentsRestant(1);
		quetes = new ArrayList<Quete>();
		quetes.add(new QueteRessources());
		quetes.add(new QueteRessourceExtracteursNiveau3());
		quetes.add(new QueteRessourceExtracteursNiveau5());
		quetes.add(new QueteTuer());
		
		unitesAttaquantes = new ArrayList<UniteAttaquante>();
		
		
		
	}
	
	public Map getMap()
	{
		return quetes.get(this.numeroQueteActuelle).getMap();
	}
	
	public Map getMapAdverse()
	{
		Map map = new Map(10,9);
		map.marquerCreationBatiment(getListeBatimentJoueurEnnemi().get(0));
		return map;
	}
	
	public boolean estFinie()
	{
		if(numeroQueteActuelle > quetes.size()-1)
			finie = true;
		return finie;
	}
	
	public Joueur getAdversaire()
	{
		return this.adversaire;
	}
	
	public Joueur getJoueur() {
		return joueur;
	}
	
	public void setJoueur(Joueur joueur) {
		this.joueur = joueur;
	}
	
	public ArrayList<Quete> getQuetes() {
		return quetes;
	}
	
	public void setQuetes(ArrayList<Quete> quetes) {
		this.quetes = quetes;
	}
	
	public int getNumeroQueteActuelle() {
		return numeroQueteActuelle;
	}
	
	public void setNumeroQueteActuelle(int numeroQueteActuelle) {
		this.numeroQueteActuelle = numeroQueteActuelle;
	}
	
	/**
	 * doit être appelée lorsqu'une attaque est lancée
	 */
	public void attaquer()
	{
		//l'état de la partie devient attaque
		etatPartie = 1;
		
		//...
		listeBatimentAdversaire = new ArrayList<Batiment>();
		Batiment def = new TourArcher(new Position(3,3));
		def.setJoueur(adversaire);
		listeBatimentAdversaire.add(def);
		adversaire.setNbrBatimentsRestant(1);
	}
	
	/**
	 * doit être appellée en fin d'attaque
	 */
	public void finirAttaque()
	{
		//l'état de la partie devient développement
		etatPartie = 0;
		//...
		unitesAttaquantes = new ArrayList<UniteAttaquante>();
	}


	/**
	 * pour le moment on ne retourne qu'une tourArcher pour les tests
	 * @return la liste des bâtiments ennemis
	 */
	public ArrayList<Batiment> getListeBatimentJoueurEnnemi() {
		return listeBatimentAdversaire;
	}

	/**
	 * signale à la partie que la bataille est perdue
	 */
	public void perdreBataille() {
		System.out.println("LA BATAILLE EST PERDUE");
		finirAttaque();
	}
	
	
	/**
	 * signale à la partie que la bataille est perdue
	 */
	public void gagnerBataille() {
		//System.out.println("LA BATAILLE EST GAGNEE");
		finirAttaque();
	}

}
